package org.zjt.book.implicittest

/**
  * 1、implicit转化器： implicit方法实现对象的自动转换
  **/
object ImplicitDemo {

  def display(input:String):Unit = println(input)

  // TODO: implicit转换器设置
  implicit def typeConvertor(input:Int):String = input.toString
  implicit def typeConvertor(input:Boolean):String = if(input) "------true" else "false"

  def main(args: Array[String]): Unit = {

    // TODO: 自动调用实例中（object）的implicit转换方法
    display("1212")
    display(12)
    display(true)
  }

}


/**
  *  2、implicit变量： 提供隐式参数实现
  */
object ImplicitDemo2{

  /** implicit变量：银色参数 */
  object Context{
    implicit val ccc:String = "implicit"
  }


  object Param{

    /**  implicit prefix : String 隐式参数 */
    def print(content:String)(implicit prefix : String){
      println(prefix+":"+content)
    }


  }


  def main(args: Array[String]) {
    Param.print("jack")("hello")

    implicit val name :String  ="zhang"
    Param.print("jack")

    /** 导入隐式的变量     PS:一个作用域只能有一个隐式变量 */
    //import Context._   正确
    Param.print("jack")
  }

}




/**
  * 3、隐式转化器： 调用隐式转化器  AminalType => SwingType
  */
class SwingType{
  def  wantLearned(sw : String) = println("兔子已经学会了"+sw)
}

// TODO: 实例提供一个转化器
object swimming{
  implicit def learningType(s : AminalType) = new SwingType
}
object AminalType extends  App{

  // TODO: 调用隐式转化器  AminalType => SwingType
  import org.zjt.book.implicittest.swimming._

  val rabbit = new AminalType("兔子")
  rabbit.wantLearned("breaststroke")         //蛙泳
}

//case class，Scala编译器为其自动生成equals方法和toString方法
case class AminalType(name:String)